package com.jf.cloud.service.sysmanager.common.util;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;


/**
 * 类名:com.igame.app.utils.SpringContextUtils
 * 获取 spring  容器的 一个实体 <pre>
 * 版权: Copyright (C) 2011  www.3yx.com
 * 编写者：ouyang
 * </pre>
 */
@SuppressWarnings("all")
@Component
public class SpringContextUtil implements BeanFactoryAware {
	 // bean工厂类 随容器一起启动
	 private static BeanFactory beanFactory;
	 // 应用上下文，需要手动加载xml文件启动Spring  【非web项目中需要使用此方式启动】
	 private static ApplicationContext context = null;
	 static Log log = LogFactory.getLog(SpringContextUtil.class);
	/**
	 * TODO 方法getBeanFromContext的简要说明:★ 获取指定的对象 一般不建议使用 <br><pre>
	 */
	public static <T>T getBeanFromContext(Class<T> t, String beanName) {
		T tt = (T)getContext().getBean(beanName); 
		return tt;
	}
	/**
	 * TODO  ★ 初始化 bean 工厂 <br><pre>
	 */
	private static BeanFactory getContext() {
		if(null==beanFactory){ // 为初始化 Spring
			initSpringContext();
		}
		return beanFactory;
	}
	/**
	 * 加载Spring 配置文件 只会加载 默认的配置文件
	 */
	@Deprecated
	public synchronized static  void initSpringContext() {
		if(context==null){
			context = new ClassPathXmlApplicationContext("applicationContext.xml");
		}
	}
	/**
	 * 加载Spring 配置文件 【加载指定路径的配置文件 单个】
	 */
	@Deprecated
	public synchronized static  void initSpringContext(String config) {
		if(context==null){
			context = new ClassPathXmlApplicationContext(config);
		}
	}
	/**
	 * 加载Spring 配置文件 【一次性加载多个配置文件】
	 */
	@Deprecated
	public synchronized static  void initSpringContext(String[] configs) {
		if(context==null){
			context = new ClassPathXmlApplicationContext(configs);
		}
	}
	/**
     * 获取类型为requiredType的对象
     */
    public static <T> T getBean(Class<T> clz) throws BeansException {
        T result = (T) getContext().getBean(clz);
        return result;
    }
	/**
     * 获取名称为name类型为requiredType的对象
     */
    public static <T> T getBean(String name, Class<T> clz) throws BeansException {
        T result = (T) getContext().getBean(name, clz);
        return result;
    }
    /**
     * 如果BeanFactory包含一个与所给名称匹配的bean定义，则返回true
     */
    public static boolean containsBean(String name) {
        try {
			return getContext().containsBean(name);
		} catch (RuntimeException e) {
			log.error("判断BeanFactory包含一个与所给名称匹配 出错了", e);
		}
		return false;
    }

    /**
     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 
     * 如果与给定名字相应的bean定义没有被找到，将会抛出一个异常（NoSuchBeanDefinitionException）
     */
    public static boolean isSingleton(String name)  {
        try {
			return getContext().isSingleton(name);
		} catch (NoSuchBeanDefinitionException e) {
			log.error("判断以给定名字注册的bean定义是一个singleton还是一个prototype 出错了", e);
		}
		return false;
    }

    /**
     * @param name
     * @return Class 注册对象的类型
     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
     */
    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
        return getContext().getType(name);
    }
	public  void setBeanFactory(BeanFactory beanFactory) {
		this.beanFactory = beanFactory;
	}
}
